//
//  DMCommercialManager.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/8/20.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * 商业化SDK - 关卡胜利与买量事件上报功能
 * 注意：此为新增功能模块，不修改现有WDHeader中的广告接口
 */
@interface DMCommercialManager : NSObject

/**
 * FB广告统计数据
 */
@property (nonatomic, strong) NSMutableDictionary *fbAdStatistics;

/**
 * 单例实例
 * @return WDCommercialSDK单例对象
 */
+ (instancetype)sharedInstance;

#pragma mark - 双广告位配置类方法

/**
 * 检查指定广告类型是否启用双广告位模式
 * @param adType 广告类型（interstitial/rewarded/banner）
 * @return YES表示启用双广告位，NO表示使用单广告位
 */
+ (BOOL)isDualAdEnabledForAdType:(NSString *)adType;

/**
 * 关卡胜利行为上报接口（必接）
 * 注意：此为新增接口，不修改现有广告相关接口
 * @param levelId 关卡顺序/ID
 */
- (void)setLevelWin:(NSInteger)levelId;

/**
 * 关卡胜利行为上报接口（字符串版本）
 * @param levelId 关卡ID字符串
 */
- (void)setLevelWinWithString:(NSString *)levelId;

/**
 * 处理Firebase关卡胜利事件上报
 * @param levelId 关卡ID
 */
- (void)trackFirebaseLevelWin:(NSInteger)levelId;

/**
 * 处理Facebook关卡价值上报
 * @param levelId 关卡ID
 * @param value 关卡价值
 */
- (void)trackFacebookLevelEvent:(NSString *)levelId value:(double)value;

/**
 * 处理Facebook广告收入事件上报
 * @param levelId 关卡ID
 */
- (void)trackFacebookAdRevenue:(NSInteger)levelId;

/**
 * 处理Adjust事件上报
 * @param eventToken 事件识别码
 * @param eventName 事件名称
 */
- (void)trackAdjustEvent:(NSString *)eventToken eventName:(NSString *)eventName;

/**
 * 更新BMS配置参数
 * @param config BMS配置字典
 */
- (void)updateBMSConfig:(NSDictionary *)config;

/**
 * 检查是否应该展示FB广告
 * 注意：此方法仅用于内部广告源切换逻辑，不影响现有广告接口
 * @return YES表示可以展示，NO表示应该切换其他广告源
 */
- (BOOL)shouldShowFacebookAd;

/**
 * 选择最优广告位ID
 * 注意：此方法为内部使用，不替代现有的广告位配置接口
 * @param adType 广告类型
 * @return 选中的广告位ID
 */
- (NSString *)selectOptimalAdUnitIdForType:(NSString *)adType;

/**
 * 记录FB广告展示
 */
- (void)recordFacebookAdShow;

/**
 * 记录FB广告点击
 */
- (void)recordFacebookAdClick;

/**
 * 获取今日FB广告展示次数
 * @return 展示次数
 */
- (NSInteger)getTodayFBShows;

/**
 * 获取今日FB广告点击率
 * @return 点击率（0-100）
 */
- (double)getTodayFBClickRate;

/**
 * 重置每日统计数据（内部调用）
 */
- (void)checkAndResetDailyStats;

/**
 * 获取今日日期键值
 * @return 今日日期键值字符串
 */
- (NSString *)getTodayDateKey;

#pragma mark - 双广告位性能统计与ECPM比较

/**
 * 更新广告位性能数据
 * @param adUnitId 广告位ID
 * @param adType 广告类型（banner/interstitial/rewarded）
 * @param ecpm ECPM值
 * @param revenue 收入
 * @param isSuccess 是否成功展示
 */
- (void)updateAdUnitPerformance:(NSString *)adUnitId
                         adType:(NSString *)adType
                           ecpm:(double)ecpm
                        revenue:(double)revenue
                      isSuccess:(BOOL)isSuccess;

/**
 * 记录广告加载请求
 * @param adUnitId 广告位ID
 * @param adType 广告类型
 */
- (void)recordAdLoadRequest:(NSString *)adUnitId adType:(NSString *)adType;

/**
 * 记录广告位性能数据（简化版本）
 * @param adUnitId 广告位ID
 * @param ecpm ECPM值
 * @param fillRate 填充率
 * @param clickRate 点击率
 * @param isSuccess 是否成功
 */
- (void)recordAdUnitPerformance:(NSString *)adUnitId
                           ecpm:(double)ecpm
                       fillRate:(double)fillRate
                      clickRate:(double)clickRate
                      isSuccess:(BOOL)isSuccess;

/**
 * 获取广告位历史性能数据
 * @param adUnitId 广告位ID
 * @return 性能数据字典
 */
- (NSDictionary *)getAdUnitPerformanceData:(NSString *)adUnitId;

/**
 * 比较两个广告位的ECPM和性能，选择最优广告位
 * @param primaryAdUnitId 主广告位ID
 * @param secondaryAdUnitId 备用广告位ID
 * @param primaryECPM 主广告位当前ECPM
 * @param secondaryECPM 备用广告位当前ECPM
 * @return 最优广告位ID
 */
- (NSString *)selectOptimalAdUnitBetween:(NSString *)primaryAdUnitId
                            andSecondary:(NSString *)secondaryAdUnitId
                             primaryECPM:(double)primaryECPM
                           secondaryECPM:(double)secondaryECPM;

/**
 * 比较两个广告位并选择最优的（简化版本）
 * @param primaryAdUnitId 主广告位ID
 * @param secondaryAdUnitId 备用广告位ID
 * @return 最优广告位ID
 */
- (NSString *)compareAdUnitsAndSelectOptimal:(NSString *)primaryAdUnitId
                            secondaryAdUnitId:(NSString *)secondaryAdUnitId;

/**
 * 检查是否需要切换广告源
 * @param currentAdUnitId 当前广告位ID
 * @param adType 广告类型
 * @return YES表示需要切换，NO表示继续使用当前广告源
 */
- (BOOL)shouldSwitchAdSource:(NSString *)currentAdUnitId adType:(NSString *)adType;

/**
 * 检查是否需要切换广告位（FB策略控制）
 * @param adType 广告类型
 * @param adUnitId 当前广告位ID
 * @return YES表示需要切换，NO表示继续使用当前广告位
 */
- (BOOL)shouldSwitchAdForType:(NSString *)adType adUnitId:(NSString *)adUnitId;

/**
 * 检查广告位是否应该展示（FB策略控制）
 * @param adUnitId 广告位ID
 * @param adType 广告类型
 * @return YES表示可以展示，NO表示不应展示
 */
- (BOOL)shouldShowAd:(NSString *)adUnitId adType:(NSString *)adType;

/**
 * 检查广告位是否应该展示（FB策略控制）- 兼容方法
 * @param adUnitId 广告位ID
 * @param adType 广告类型
 * @return YES表示可以展示，NO表示不应展示
 */
- (BOOL)shouldShowAdWithAdUnitId:(NSString *)adUnitId adType:(NSString *)adType;

/**
 * 检查广告位是否应该展示（FB策略控制）- 支持区分主备广告位
 * @param adUnitId 广告位ID
 * @param adType 广告类型
 * @param isSecondaryAdUnit 是否为备用广告位
 * @return YES表示可以展示，NO表示不应展示
 */
- (BOOL)shouldShowAd:(NSString *)adUnitId adType:(NSString *)adType isSecondaryAdUnit:(BOOL)isSecondaryAdUnit;

/**
 * 记录广告位的网络信息
 * @param adNetwork 广告网络名称
 * @param adUnitId 广告位ID
 */
- (void)recordAdNetworkInfo:(NSString *)adNetwork adUnitId:(NSString *)adUnitId;

/**
 * 获取广告位的网络信息
 * @param adUnitId 广告位ID
 * @return 广告网络名称，如果没有记录则返回nil
 */
- (NSString *)getAdNetworkInfo:(NSString *)adUnitId;

/**
 * 获取广告位的综合评分
 * @param adUnitId 广告位ID
 * @return 综合评分（0-100）
 */
- (double)getAdUnitScore:(NSString *)adUnitId;

/**
 * 重置广告位性能统计数据
 * @param adUnitId 广告位ID，如果为nil则重置所有数据
 */
- (void)resetAdUnitPerformanceData:(NSString * _Nullable)adUnitId;

/**
 * 获取所有广告位的性能统计报告
 * @return 性能报告字典
 */
- (NSDictionary *)getPerformanceReport;

@end

NS_ASSUME_NONNULL_END

